/**
 * 自定义按钮，具有普通静止，鼠标在上，选中，失效状态，能被外部定义事件处理
 * 
 *1, setLableColor里默认的颜色是普通静止
 * 分析问题,看是什么需求
 * 
 * //最上面是mc_pm，标志出动态字的位置和大小
*	//上面有一个TextField
*	//mc模型，1是普通静止，2是鼠标在上，3是选中，4是失效,有一个mc是label
 * _____________________________
 * !!坏消息，做实验发现这个没有被垃圾收集
 * 
 * 这个简写的头是
 * 
 * !!很重大的经验，这个做出来之后sb=new SmartButton()如果不保持引用，则自己的鼠标事件就会消失的,如
 * for (var i:int = 0; i <2; i ++){
		var mc_item : MovieClip =Util.AttachMC("MyMc_kk");
		var sb:SmartButton=new SmartButton(mc_item,"一手很差事地方可怜见地方连脚裤撒旦立刻机");
		smartList.addItem (mc_item,30);
	}
	这种代码导致鼠标滚进滚出的事件消失，原因也比较简单，因为sb不存在了
	
	//鼠标放上去显示手，这个处理很重要，如果一个tf是不可能显示手的，需要一个mc来承载它，因为sprite才有buttonMode,
		//并且必须mouseChilder=false,才能使鼠标在tf上显示手
 */
package kgame5.kgui.kcomp {
import kgame5.kutil.*;

import flash.display.*;
import flash.events.*;

//import flash.text.*;

public class SmartButton extends EventDispatcher{
	public static const EVENTTYPE_CLICK:String="EVENTTYPE_CLICK";
	//_________________Property____________________
	
	private var mc:MovieClip=null;
	
	private var smartText:SmartText=null;
	
	private var smartIcon:SmartIcon;
	//
	private var isActive2:Boolean=true;
	private var isSelected2:Boolean=false;
	
	//
	private var 
		Color1:int=0xffffff,//第1真字颜色
		Color2:int=0xffff00,//第2真字颜色
		
		Color3:int=0xff0000,//第3真字颜色
		Color4:int=0x333333;//第4真字颜色
	
	//小图标在生效失效的时候的亮度
	private var 
		BRIGHTNESS_ACTIVE:Number=0,
		BRIGHTNESS_DEACTIVE:Number=-0.5;
		
	//强制字体滚动;就是即使鼠标没在上面也滚动
	private var bForceScroll:Boolean=false;
	
	public var data:Object;//这个通用的数据
	//____________________Method______________________
	//这个填充图片是按照mc_picPm来做的,不管位图是多大
	public function SmartButton(p_mc:MovieClip,label:String="",bmdIcon:BitmapData=null){
		
		mc=p_mc;
		
		mc.gotoAndStop(1);//停在第一真
		
		//--滚动字相关的
		if(mc.tf!=null){//这个是有用的，可能会出现没有tf的情况，就是只是一个没有滚动字的smartButton
			var mc_pm:MovieClip=mc.mc_pm;
			//初始化滚动字
			//T.p("SB初始化滚动字:"+mc+" "+mc.mc_scrolltext);
			var W:int=mc_pm.width;
			var H:int=mc_pm.height;
			
			smartText=new SmartText(mc.tf,
				W,H,
				label);
			
			smartText.getDO().x=mc_pm.x;
			smartText.getDO().y=mc_pm.y;
			
			//默认的颜色是普通静止
			smartText.SetColor(Color1);
			
			//脚手架不用了就干掉
			//mc.removeChild(mc.mc_pm);
			//mc_pm.alpha=0;
			mc_pm.visible=false;
		}
		
		//--加载图片相关的,这个最后再做
		if(mc.mc_picC!=null){
			var mc_pmPic:MovieClip=mc.mc_pmPic;
			mc_pmPic.visible=false;
			
			smartIcon=new SmartIcon(mc_pmPic.width,mc_pmPic.height,bmdIcon);
			
			///smartIcon.getDO().x=0;//mc_pmPic.x;
			///smartIcon.getDO().y=0;//mc_pmPic.y;
			mc.mc_picC.x=mc_pmPic.x;
			mc.mc_picC.y=mc_pmPic.y;
			
			mc.mc_picC.addChild(smartIcon.getDO());
		}
		
		//鼠标放上去显示手，这个处理很重要，如果一个tf是不可能显示手的，需要一个mc来承载它，因为sprite才有buttonMode,
		//并且必须mouseChilder=false,才爱能使鼠标在tf上显示手
		mc.buttonMode=true;
		mc.useHandCursor=true;
		mc.mouseChildren=false;
		
		//鼠标滑进滑出,!!注意用的是rollOver 和rollOut而不是mouseOver和mouseOut,
		//mouseOver和mouseOut特别灵敏，就是在子mc之间移进移出也会触发，大多数情况下用rollOver 吧
		mc.addEventListener(MouseEvent.ROLL_OVER,rollOverHandler,false,0,true);
		mc.addEventListener(MouseEvent.ROLL_OUT,rollOutHandler,false,0,true);
		
		mc.addEventListener(MouseEvent.CLICK, onClick);
	}
	public function getMC():MovieClip{
		return mc;
	}
	public function dispose(){
		//this.smartText.dispose();
		Util.RemoveMovieClip(this.getMC());
	}
	
	//ms_delay是延迟加栽图片的时间,毫秒
	public function LoadIconBmd(sUrlBmd:String,ms_delay:int=0){
		//T.p("----------------LoadIconBmd",ms_delay);
		if(ms_delay==0){//
			smartIcon.LoadBmd(sUrlBmd);
		}else{//延迟加栽
			smartIcon.DelayLoadBmd(sUrlBmd,ms_delay);
		}
	}
	public function SetIconBmd(bmd:BitmapData){
		smartIcon.SetBmd(bmd);
	}
//	private var func_mdh:Function;
//	public function OnPress(func_exe:Function){
//		func_mdh=function(e:MouseEvent){
//			////trace("鼠标按下SmartButton:"+isActive());
//			if(isActive()==false){
//				return;
//			}
//			func_exe();
//		};
//		this.getMC().addEventListener(MouseEvent.MOUSE_DOWN,func_mdh,false,0,true);
//	}

	private function onClick(e:MouseEvent){
		if(isActive()){
			this.dispatchEvent(new KEvent(EVENTTYPE_CLICK));
		}
	}
	private function rollOverHandler(e:MouseEvent){
		//T.p("鼠标滑进"+e.target);
			if(isActive2==false){//锁定则返回
				return;
			}
			
			//背景
			if(isSelected2==false){//没有在选中状态
				mc.gotoAndStop(2);//鼠标在上
				
				if(smartText!=null){
					smartText.SetColor(Color2);
					
					smartText.StartScroll();
				}
			}else{//选中状态下鼠标滑进
				
			}
	}
	
	private function rollOutHandler(e:MouseEvent){
		
			//T.p("鼠标滑出"+e.target);
			if(isActive2==false){//锁定则返回
				return;
			}
			//背景
			if(isSelected2==false){//没有在选中状态
				mc.gotoAndStop(1);//平时
				if(smartText!=null){
					smartText.SetColor(Color1);
				}
			}else{//选中状态下鼠标滑出
				if(smartText!=null){
					smartText.SetColor(Color3);
				}
			}
			
			if(bForceScroll==false){//没有锁定强制滚动,在滑出的时候才能停止滚动呢
				if(smartText!=null){
					smartText.StopScroll();
				}
			}
	}
	public function SetLabel(l:String){
		//T.p("smartButton.setLabel:"+l);
		if(smartText!=null){
			smartText.SetText(l);
		}
	}
	//设置标签字的颜色,普通静止，鼠标在上，选中，失效状态
	public function SetLableColor(c1:int,c2:int,c3:int,c4:int){
		Color1=c1;
		Color2=c2;
		Color3=c3;
		Color4=c4;
		//T.p("SmartButton设置了颜色:"+" "+Color1+" "+Color2+" "+Color3+" "+Color4);
		
		//默认的颜色是普通静止
		if(smartText!=null){
			smartText.SetColor(Color1);
		}
	}
	//
	public function isActive():Boolean{
		return isActive2;
	}
	public function isSelected():Boolean{
		if(mc.currentFrame==3){
			return true;
		}else{
			return false;
		}
	}
	
	//
	public function active(){
		isActive2=true;
		mc.gotoAndStop(1);
		
		if(smartText!=null){
			smartText.SetColor(Color1);
			
			
			//这个是为了处理从选中状态直接到active的时候
			smartText.StopScroll();
		}
		
		if(smartIcon!=null){
			//Tween2DX.SetBrightness(smartIcon.getDO(),BRIGHTNESS_ACTIVE);
		}
	}
	public function deActive(){
		isActive2=false;
		mc.gotoAndStop(4);
		
		if(smartText!=null){
			smartText.SetColor(Color4);
			//停止字的滚动	
			smartText.StopScroll();
		}
		
		if(smartIcon!=null){
			//Tween2DX.SetBrightness(smartIcon.getDO(),BRIGHTNESS_DEACTIVE);
		}
		
		bForceScroll=false;
	}
	public function selected(){
		if(isActive2){
			isSelected2=true;
			mc.gotoAndStop(3);
			
			if(smartText!=null){
				smartText.SetColor(Color3);
				//T.p(mc_Model+" selected");
				
				//
				smartText.StartScroll();
			}
			bForceScroll=true;
		}else{
			//T.p(mc_Model+" selected 是在isActive2=false里调用的，没改变!!");
		}
	}
	public function deSelected(){
		if(isActive2){
			isSelected2=false;
			mc.gotoAndStop(1);
			
			if(smartText!=null){
				//mc_Model.mc_scrolltext.mc_tf.tf.textColor=Color1;
				smartText.SetColor(Color1);
				
				smartText.StopScroll();
			}
			bForceScroll=false;
		}else{
			//T.p(mc_Model+" deSelected 是在isActive2=false里调用的，没改变!!");
		}
	}
	//在选中与普通之间切换,返回的是是否开关
	//返回1表示是选中，0表示没有,-1表示现在是isActive=false,不响应操作
	public function onOff():int{
		if(isActive2){
			if(isSelected2){
				deSelected();
				return 1;
			}else{
				selected();
				return 0;
			}
		}
		return -1;
	}
	//被选中是1,没被选中是0，失效是-1
	public function getState():int{
		if(isActive2){
			if(isSelected2){
				return 1;
			}else{
				return 0;
			}
		}else{
			return -1;
		}
	}
	//-1,0,1来设置初始状态
	public function setState(s:int){
		//T.p("sb.setState:"+s);
		switch(s){
			case 0:
			this.active();
			break;
			case 1:
			this.active();
			this.selected();
			break;
			case -1:
			this.deActive();
			break;
		}
	}
	
}//end of class
}